#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
#include<cassert>

using namespace std;

//这个函数的流程，首先先从键盘读取数据到缓冲区，再从缓冲区
//读取数据到管道，然后再由管道将数据写入到显示屏
// int main()
// {
//     int pipefd[2]={0};
//     int n=pipe(pipefd);
//     assert(n != -1);
//     char buffer[1024]={0};

//     while(fgets(buffer,1024,stdin))
//     {
//         int len=strlen(buffer);
//         if(write(pipefd[1],buffer,len) != len)
//         {
//             perror("write to pipe");
//             break;
//         }
//         memset(buffer,0x00,len);
//         if(read(pipefd[0],buffer,len) != len)
//         {
//             perror("read from pipe");
//             break;
//         }
//         if(write(1,buffer,len) != len)
//         {
//             perror("write to stdout");
//             break;
//         }
//     }
//     return 0;
// }

// int main()
// {
//     int pipefd[2]={0};
//     int n=pipe(pipefd);
//     assert(n != -1);
//     char buffer[1024]={0};

//     while(fgets(buffer,1024,stdin))
//     {
//         int len=strlen(buffer);
//         int ret=write(pipefd[1],buffer,len);
//         if(ret != len)
//         {
//             perror("wrtie to pipe");
//             break;
//         }
//         memset(buffer,0x00,len);
//         ssize_t s=read(pipefd[0],buffer,len);
//         if(s != len)
//         {
//             perror("read from pipe");
//             break;
//         }
//         int res=write(1,buffer,len);
//         if(res != len)
//         {
//             perror("write to stdout");
//             break;
//         }
//     }
//     return 0;
// }
// int main()
// {
//     int pipefd[2]={0};
//     int n=pipe(pipefd);
//     assert(n != -1);
//     char buffer[1024]={0};

//     while(fgets(buffer,1024,stdin))
//     {
//         int len=strlen(buffer);
//         int ret=write(pipefd[1],buffer,len);
//         if(ret != len)
//         {
//             perror("write to pipe");
//             break;
//         }
//         memset(buffer,0x00,len);
//         ssize_t s=read(pipefd[0],buffer,len);
        
//         if(s != len)
//         {
//             perror("read from pipe");
//             break;
//         }

//         int res=write(1,buffer,len);
//         if(res != len)
//         {
//             perror("write to pipe");
//             break;
//         }
//     }
//     return 0;
// }
// int main()
// {
//     int pipefd[2]={0};
//     int n=pipe(pipefd);
//     assert(n != -1);
//     char buffer[1024]={0};

//     //不可能从键盘当中直接读取到管道当中
//     while(fgets(buffer,1024,stdin))
//     {
//         int len=strlen(buffer);
//         if(write(pipefd[1],buffer,len) != len)
//         {
//             perror("write to pipe");
//             break;
//         }
//         memset(buffer,0x00,len);
        
//         if(read(pipefd[0],buffer,len) != len)
//         {
//             perror("read from stdin");
//             break;
//         }

//         if(write(1,buffer,len) != len)
//         {
//             perror("write to stdout");
//             break;
//         }
//     }
//     return 0;
// }
// int main()
// {
//     mkfifo("tp",0644);
//     //这里的open函数的返回值是一个新的文件描述符，如果错误的
//     //话会返回-1
//     int infd=open("tp",O_RDONLY);
//     if(infd == -1)
//     {
//         perror("open");
//         exit(-1);
//     }

//     int outfd=open("tp",O_WRONLY);
//     if(outfd==-1)
//     {
//         perror("open");
//         exit(-2);
//     }
//     char buffer[1024]={0};
//     ssize_t s=read(infd,buffer,strlen(buffer));
//     while(s > 0)
//     {
//         write(outfd,buffer,strlen(buffer));
//     }
//     close(infd);
//     close(outfd);
//     return 0;
// }
// int main()
// {
//     //这里定义着一个命名管道
//     mkfifo("tp",0644);
//     int infd=open("tp",O_RDONLY);
//     if(infd == -1)
//     {
//         perror("open");
//         exit(-1);
//     }

//     //open函数的功能是返回一个新的文件描述符
//     //这里管道的打开方式是open
//     int outfd=open("tp",O_WRONLY);
//     if(outfd == -1)
//     {
//         perror("open");
//         exit(-1);
//     }

//     char buffer[1024]={0};
//     ssize_t s=read(infd,buffer,strlen(buffer));
//     while(s > 0)
//     {
//         write(outfd,buffer,strlen(buffer));
//     }
//     close(infd);
//     close(outfd);

//     return 0;
// }